#
# ﻿Empresa desarrolladora: Fujitsu Technology Solutions S.A. - http://ts.fujitsu.com Felipe Munoz Castillo - 29/07/2013
#
# Autor: Junta de Andalucía
# Derechos de explotación propiedad de la Junta de Andalucía.
#
# Éste programa es software libre: usted tiene derecho a redistribuirlo y/o modificarlo bajo los términos de la Licencia EUPL European Public License publicada por el organismo IDABC de la Comisión Europea, en su versión 1.0. o posteriores.
#
# Éste programa se distribuye de buena fe, pero SIN NINGUNA GARANTÍA, incluso sin las presuntas garantías implícitas de USABILIDAD o ADECUACIÓN A PROPÓSITO CONCRETO. Para mas información consulte la Licencia EUPL European Public License.
#
# Usted recibe una copia de la Licencia EUPL European Public License junto con este programa, si por algún motivo no le es posible visualizarla, puede consultarla en la siguiente URL: http://ec.europa.eu/idabc/servlets/Docb4f4.pdf?id=31980
#
# You should have received a copy of the EUPL European Public License along with this program. If not, see
# http://ec.europa.eu/idabc/servlets/Docbb6d.pdf?id=31979
#
# Vous devez avoir reçu une copie de la EUPL European Public License avec ce programme. Si non, voir http://ec.europa.eu/idabc/servlets/Doc5a41.pdf?id=31983
#
# Sie erhalten eine Kopie der europäischen EUPL Public License zusammen mit diesem Programm. Wenn nicht, finden Sie da http://ec.europa.eu/idabc/servlets/Doc9dbe.pdf?id=31977
#
module RedmineHgpIssues
	class IssuesHooks < Redmine::Hook::ViewListener
  
    UPDATE_BY_FILTER="updated_by"

    def hgp_available_filters(context = {})
      
      filters = context[:filters]
      
      new_filters = {}
      author_values = filters['author_id'][:values]
      
      actualizado_por = ::I18n.translate('label_updated_time_by') 
      actualizado_por=actualizado_por[0..(actualizado_por.index("%{author}")-2)]
      new_filters[UPDATE_BY_FILTER] = { :type => :list, :order => 16, :values => author_values, :name => actualizado_por} unless author_values.empty?
      new_filters["parent_id"] = { :type => :integer, :order => 17, :name => ::I18n.translate('field_parent_issue')}
      new_filters["description"] = {:type=>:text, :order=>18, :name => ::I18n.translate('field_description')}
      
      new_filters
    end
    
    def hgp_statement(context = {})
      
      query = context[:query]
      
      # filters clauses
      filters_clauses = []
      query.filters.each_key do |field|
      next if field == "subproject_id"
      v = query.values_for(field).clone
      next unless v and !v.empty?
      operator = query.operator_for(field)

      # "me" value subsitution
      if %w(assigned_to_id author_id watcher_id).include?(field) or UPDATE_BY_FILTER.include?(field)
        if v.delete("me")
          if User.current.logged?
            v.push(User.current.id.to_s)
            v += User.current.group_ids.map(&:to_s) if field == 'assigned_to_id'
          else
            v.push("0")
          end
        end
      end
      
      # Para el caso del campo update by, tenemos que hacer
      # una consulta bastante intrusiba
      if field == UPDATE_BY_FILTER
        debugger
        # Componemos el in de los ids de usaurio
        in_clause = " in (" + v.collect{|val| "'#{query.connection.quote_string(val)}'"}.join(",") + ")"
        # Parametrizamos los nombres de los campos para que sea mantenible
        user_column = "user_id"
        journal_issue_fk = "journalized_id"
        journal_type = "journalized_type"
        issue_type = "\'Issue\'"
        issue_id = "issues.id"
        # miramos si existe alguna actualizacion de ticket, para ese journalized_id y ese usuario
        sub_query = "(exists (select * from " + Journal.table_name + " j_updated_by where j_updated_by." + user_column + in_clause + " and j_updated_by." + journal_issue_fk + "=" + issue_id + " and j_updated_by." + journal_type + "=" + issue_type + "))"
        # Finalmente la metemos en el filtro de clausulas
        filters_clauses << sub_query
      elsif field =~ /^cf_(\d+)$/
        # custom field
        filters_clauses << query.sql_for_custom_field_public(field, operator, v, $1)
      elsif query.respond_to?("sql_for_#{field}_field")
        # specific statement
        filters_clauses << query.send("sql_for_#{field}_field", field, operator, v)
      else
        # regular field
        filters_clauses << '(' + query.sql_for_field_public(field, operator, v, Issue.table_name, field) + ')'
      end
    end if query.filters and query.valid?

    filters_clauses << query.project_statement
    filters_clauses.reject!(&:blank?)

    filters_clauses.any? ? filters_clauses.join(' AND ') : nil
    end
    
    
	end
end